/**
 * 手写 Promise.all 实现
 * Promise.all 接收一个可迭代对象（如数组），返回一个新的 Promise
 * 当所有 Promise 都成功时，返回的 Promise 才成功，结果值为所有 Promise 结果的数组
 * 如果任何一个 Promise 失败，则立即失败，失败原因为第一个失败的 Promise 的原因
 */

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    // 检查输入是否为可迭代对象
    if (promises == null || typeof promises[Symbol.iterator] !== 'function') {
      return reject(new TypeError('Argument is not iterable'));
    }

    // 将可迭代对象转换为数组
    const promisesArray = Array.from(promises);
    const total = promisesArray.length;
    const results = []; // 存储每个 Promise 的结果

    // 如果输入为空，直接返回空数组
    if (total === 0) {
      return resolve(results);
    }

    let completedCount = 0; // 已完成的 Promise 数量

    // 使用 for...of 循环遍历数组，同时获取索引
    for (const [currentIndex, promise] of promisesArray.entries()) {
      // 确保每个元素都是 Promise，如果不是则转换为 Promise
      Promise.resolve(promise)
        .then(result => {
          // 将结果存储在正确的位置
          results[currentIndex] = result;
          completedCount++;

          // 当所有 Promise 都完成时，解析最终结果
          if (completedCount === total) {
            resolve(results);
          }
        })
        .catch(reject); // 任何一个 Promise 失败，立即拒绝
    }
  });
}
